# tento skript naprogramuje nizkonapetove programovou nebo datovou pamet
# nastavi take pojistky a zamky mikrokontroleru
# hodnoty LW, HW a KW jsou kriticke, SPIEN musi byt 0(prog) a RSTDSBL musi byt 1(unprog)

# vysvetlivky:
# RE - reset programatoru, zhasne cervena LED
# SL - Start Low voltage programing, nastavi pin RESET na 0 a provede identifikaci obvodu
#      v pripade chyby se rozsviti cervena LED a zustane svitit, dokud se neprovede prikaz RE
# SH - Start High voltage programming, nastavi pin RESET na +12,5V a provede indetifikaci obvodu
#       v pripade chyby se rozsviti cervena LED, na RESETu zustane +12,5V a dalsi prikazy budou ignorovany az do prikazu RE
#       Vysokonapetove programovat lze jen obvody ATtiny
# CE - Chip Erase, vymaze programovou (flash), datovou (eeprom) pamet a smaze zamky (locks)
# PW - Program Write, pripravi se na programovani flash pameti
# cat flash.hex >> /dev/ttyACM0 - posle Intel Hex soubor do programatoru
# PT - Program Test, v pripade neshody nasledne poslaneho Intel Hex souboru s programovou pameti se rozsviti cervena LED
# DW - Data Write, pripravi se na programovani eeprom
# DT - Data Test, zkontroluje eeprom s nasledne poslanym souborem, pri neshode se rozsviti cervena LED
# LW XX - Low fuse Write, nastavi dolni pojistky na hodnotu XX (hexa), nepouzite bity nastavte na 1
# LT XX - Low fuse Test, porovna dolni pojistky s hodnotou XX (hexa), nepouzite bity museji byt nastaveny na 1
# HW XX - High fuse Write, nastavi horni pojistky na hodnotu XX (hexa), nepouzite bity nastavte na 1
# HT XX - High fuse Test, porovna horni pojistky s hodnotou XX (hexa), nepouzite bity museji byt nastaveny na 1
# EW XX - Extended fuse Write, nastavi rozsirene pojistky na hodnotu XX (hexa), nepouzite bity nastavte na 1
# ET XX - Extended fuse Test, porovna rozsirene pojistky s hodnotou XX (hexa), nepouzite bity museji byt nastaveny na 1
# KW XX - locK Write, nastavi zamky na hodnotu XX (hexa), nepouzite bity nastavte na 1
# KT XX - locK Test, porovna zamky s hodnotou XX (hexa), nepouzite bity museji byt nastaveny na 1
# OK - pin RESET je nastaven na 1, konec programovani

# pri programovani pojistek a zamku plati:
# 0 znamena naprogramovany (programmed) a tudiz platny
# 1 znamena nenaprogramovany (unprogrammed) a tudiz neplatny
# pojistky a zamky jsou tedy technicky vzato ACTIVE LOW
# napr. SPIEN=0 znamena, ze SPIEN je programmed(aktivni), SPI ENABLED - nizkonapetove SPI programovani je povoleno
# napr. RSTDSBL=1 znamena, ze RSTDSBL neni pravda, tedy RST neni DiSaBLed a tim padem je ENabled a pin RESET slouzi k resetu, nikoliv jako I/O pin

echo Reset \(RE\)
echo RE >> /dev/usbprog0
echo Start Low voltage programming \(SL\)
echo SL >> /dev/usbprog0
echo Chip Erase \(CE\)
echo CE >> /dev/usbprog0
echo Program memory Write \(PW\)
echo PW >> /dev/usbprog0
echo cat usbprog.hex
cat usbprog.hex >> /dev/usbprog0
echo Program memory Test \(PT\)
echo PT >> /dev/usbprog0
echo cat usbprog.hex
cat usbprog.hex >> /dev/usbprog0
echo Low fuses Write \(LW\)
echo LW FE >> /dev/usbprog0
echo High fuses Write \(HW\)
echo HW DF >> /dev/usbprog0
echo stop \(OK\)
echo OK >> /dev/usbprog0
echo Start Low voltage programming \(SL\)
echo SL >> /dev/usbprog0
echo locK Write \(KW\)
echo KW FC >> /dev/usbprog0
echo stop \(OK\)
echo OK >> /dev/usbprog0
echo Reset \(RE\)
echo RE >> /dev/usbprog0
echo Start Low voltage programming \(SL\)
echo SL >> /dev/usbprog0
echo locK Test \(KT\)
echo KT FC >> /dev/usbprog0
echo High fuses Test \(HT\)
echo HT DF >> /dev/usbprog0
echo Low fuses Test \(LT\)
echo LT FE >> /dev/usbprog0
echo stop \(OK\)
echo OK >> /dev/usbprog0